package platzerworld.kegeln.gui;

import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import platzerworld.kegeln.R;
import platzerworld.kegeln.common.ConstantsIF;
import platzerworld.kegeln.common.KeyValueVO;
import platzerworld.kegeln.common.preference.KegelverwaltungPreference;
import platzerworld.kegeln.common.style.StyleManager;
import platzerworld.kegeln.ergebnis.vo.ErgebnisVO;
import platzerworld.kegeln.gui.tabs.PaarungTabActivity;
import platzerworld.kegeln.klasse.db.KlasseSpeicher;
import platzerworld.kegeln.mannschaft.db.MannschaftSpeicher;
import platzerworld.kegeln.spieler.vo.SpielerVO;
import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Typeface;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

/**
 * Zeigt die Liste der Mannschaften an.
 * 
 * @author platzerg
 * 
 */
public class Spielbetrieb extends Activity implements ConstantsIF {
	private static final long serialVersionUID = -5920434564538725124L;
	private static final String TAG = Spielbetrieb.class.getSimpleName();
	
	private KlasseSpeicher mKlasseSpeicher;
	private MannschaftSpeicher mMannschaftSpeicher;
	
	private Map<Integer, ErgebnisVO[]> paarungen = new HashMap<Integer, ErgebnisVO[]>();

	static Spinner mSpielgruppeSpinner = null;
	static Spinner mMannschaftHeimSpinner = null;
	static Spinner mMannschaftGastSpinner = null;

	public int mYear;
	public int mMonth;
	public int mDay;
	
	private EditText edtSpielTag;
	private EditText edtSpielNr;
	
	private Button mPaarung1Button;
	private Button mPaarung2Button;
	private Button mPaarung3Button;
	private Button mPaarung4Button;
	private Button mPaarung5Button;
	private Button mPaarung6Button;
	
	private EditText mEdtPaarung1;
	private EditText mEdtPaarung2;
	private EditText mEdtPaarung3;
	private EditText mEdtPaarung4;
	private EditText mEdtPaarung5;
	private EditText mEdtPaarung6;
	
	private Button mButtonZwischenstand = null;
	private Button mButtonEndergebnis = null;
	
	
	private int mSelectedKlasseItemPosition=0;
	private int mSelectedMannschaftHeimItemPosition=0;
	private int mSelectedMannschaftGastItemPosition=0;
	
	private KeyValueVO mSelectedMannschaftHeimKeyValueVO = null;
	private KeyValueVO mSelectedMannschaftGastKeyValueVO = null;
	
	private ErgebnisVO mSelectedErgebnisHeimVO = null;
	private ErgebnisVO mSelectedErgebnisGastVO = null;
	
	private int mPaarungInex=0;
	
	
	@Override
	protected void onCreate(Bundle icicle) {
		super.onCreate(icicle);
		Log.d(TAG, "onCreate(): entered...");
		
		setContentView(R.layout.spielbetrieb);
		setTitle(R.string.txt_wettkampf_titel);
		
		init();
	}
	
	@Override
	protected void onStart() {
		super.onStart();
	}
	
	@Override
	protected void onResume() {
		loadPreference();
		mSpielgruppeSpinner.setSelection(mSelectedKlasseItemPosition);
		mMannschaftHeimSpinner.setSelection(mSelectedMannschaftHeimItemPosition, true);
		mMannschaftGastSpinner.setSelection(mSelectedMannschaftGastItemPosition, true);
		super.onResume();
	}

	@Override
	protected void onPause() {
		savePreference();
		Log.d(TAG, "onPause(): entered...");
		super.onPause();
	}

	@Override
	protected void onRestart() {
		super.onRestart();
	}

	@Override
	protected void onStop() {
		super.onStop();
	}

	@Override
	protected void onDestroy() {
		cleanDatabase();
		super.onDestroy();
	}
	
	@Override
	protected Dialog onCreateDialog(int id) {
	   switch (id) {
	   case DATE_DIALOG_ID:
	      return new DatePickerDialog(this, mDateSetListener, mYear, mMonth, mDay);
	   }
	   return null;
	}
	
	private DatePickerDialog.OnDateSetListener mDateSetListener =
	    new DatePickerDialog.OnDateSetListener() {
	        public void onDateSet(DatePicker view, int year,  int monthOfYear, int dayOfMonth) {
	            mYear = year; mMonth = monthOfYear; mDay = dayOfMonth;
	            updateDisplay();
	        }
	};
	
    private void updateDisplay() {
	    edtSpielTag.setText( new StringBuilder().append(mDay).append(".").append(mMonth + 1).append(".").append(mYear));
	}
	
	private void init(){
		initStyle();
		initWidgets();
		initListener();
		initContextMenu();
		initDatabase();
		
		zeigeKlassen();
	}
	
	private void initStyle() {
		Typeface font = StyleManager.getInstance().init(this).getTypeface();
		TextView titeltext = (TextView) findViewById(R.id.txt_wettkampf_titel);
		titeltext.setTypeface(font);
		
	}
	
	private void initWidgets(){
		mSpielgruppeSpinner = (Spinner) this.findViewById(R.id.sp_spielbetrieb_spielgruppe);
		mMannschaftHeimSpinner = (Spinner) this.findViewById(R.id.sp_spielbetrieb_heim_club);
		mMannschaftGastSpinner = (Spinner) this.findViewById(R.id.sp_spielbetrieb_gast_club);
		mButtonZwischenstand = (Button) findViewById(R.id.sf_spielbetrieb_zeige_zwischenergebnis);
		mButtonEndergebnis = (Button) findViewById(R.id.sf_spielbetrieb_zeige_endergebnis);
		
		mPaarung1Button = (Button) findViewById(R.id.sf_spielbetrieb_paarung_1);
		mPaarung2Button = (Button) findViewById(R.id.sf_spielbetrieb_paarung_2);
		mPaarung3Button = (Button) findViewById(R.id.sf_spielbetrieb_paarung_3);
		mPaarung4Button = (Button) findViewById(R.id.sf_spielbetrieb_paarung_4);
		mPaarung5Button = (Button) findViewById(R.id.sf_spielbetrieb_paarung_5);
		mPaarung6Button = (Button) findViewById(R.id.sf_spielbetrieb_paarung_6);
		
		mEdtPaarung1 = (EditText) findViewById(R.id.edt_spielbetrieb_paarung_1);
		mEdtPaarung2 = (EditText) findViewById(R.id.edt_spielbetrieb_paarung_2);
		mEdtPaarung3 = (EditText) findViewById(R.id.edt_spielbetrieb_paarung_3);
		mEdtPaarung4 = (EditText) findViewById(R.id.edt_spielbetrieb_paarung_4);
		mEdtPaarung5 = (EditText) findViewById(R.id.edt_spielbetrieb_paarung_5);
		mEdtPaarung6 = (EditText) findViewById(R.id.edt_spielbetrieb_paarung_6);
		
		edtSpielTag = (EditText) findViewById(R.id.edt_spielbetrieb_spieltag);
		edtSpielNr = (EditText) findViewById(R.id.edt_spielbetrieb_spielnr);
	}
	
	private void initListener(){
		mSpielgruppeSpinner.setOnItemSelectedListener(mSpinnerKlassenItemAuswahlListener);
		mMannschaftHeimSpinner.setOnItemSelectedListener(mSpinnerMannschaftenHeimItemAuswahlListener);
		mMannschaftGastSpinner.setOnItemSelectedListener(mSpinnerMannschaftenGastItemAuswahlListener);
		
		edtSpielTag.setOnTouchListener(mSpielTagListener);
		
		mButtonZwischenstand.setOnClickListener(null);
		mButtonEndergebnis.setOnClickListener(null);
		
		mPaarung1Button.setOnClickListener(mPaarung1OnOkListener);
		mPaarung2Button.setOnClickListener(mPaarung2OnOkListener);
		mPaarung3Button.setOnClickListener(mPaarung3OnOkListener);
		mPaarung4Button.setOnClickListener(mPaarung4OnOkListener);
		mPaarung5Button.setOnClickListener(mPaarung5OnOkListener);
		mPaarung6Button.setOnClickListener(mPaarung6OnOkListener);
	}
	
	private void initContextMenu(){
	}
	
	private void initDatabase(){
		mKlasseSpeicher = new KlasseSpeicher(this);
		
		final Calendar c = Calendar.getInstance();
		mYear = c.get(Calendar.YEAR);
	    mMonth = c.get(Calendar.MONTH);
	    mDay = c.get(Calendar.DAY_OF_MONTH);
	}
	
	private void cleanDatabase(){
		if(null != mKlasseSpeicher){
			mKlasseSpeicher.schliessen();
		}
		if(null != mMannschaftSpeicher){
			mMannschaftSpeicher.schliessen();
		}
	}
	
	
	private void zeigeKlassen() {
		List<KeyValueVO> klassenListeVO = mKlasseSpeicher.ladeAlleKlassenListeVO();

		ArrayAdapter<KeyValueVO> klassenAdapter = new ArrayAdapter<KeyValueVO>(
				this, android.R.layout.simple_spinner_item, klassenListeVO);

		mSpielgruppeSpinner.setAdapter(klassenAdapter);
		klassenAdapter.setDropDownViewResource(android.R.layout.simple_spinner_item);

	}

	private void zeigeMannschaftenZurKlasseId(long klasseId) {
		List<KeyValueVO> mannschaftenListeVO = mMannschaftSpeicher.ladeAlleMannschaftenZurKlasseListeVO(klasseId);

		ArrayAdapter<KeyValueVO> mannschaftenAdapter = new ArrayAdapter<KeyValueVO>(this,
				android.R.layout.simple_spinner_item, mannschaftenListeVO);

		mannschaftenAdapter.setDropDownViewResource(android.R.layout.simple_spinner_item);

		mMannschaftHeimSpinner.setAdapter(mannschaftenAdapter);
		mMannschaftGastSpinner.setAdapter(mannschaftenAdapter);
		

	}

	private final AdapterView.OnItemSelectedListener mSpinnerKlassenItemAuswahlListener = new AdapterView.OnItemSelectedListener() {
		public void onItemSelected(AdapterView<?> arg0, View arg1, int position, long id) {
			mSelectedKlasseItemPosition = position;
			
			KeyValueVO keyValueVO = (KeyValueVO) mSpielgruppeSpinner.getSelectedItem();
			
			mMannschaftSpeicher = new MannschaftSpeicher(Spielbetrieb.this);
			zeigeMannschaftenZurKlasseId(keyValueVO.key);
			if(mSelectedMannschaftHeimItemPosition <= mMannschaftHeimSpinner.getAdapter().getCount()){
				mMannschaftHeimSpinner.setSelection(mSelectedMannschaftHeimItemPosition);
			}else{
				mMannschaftHeimSpinner.setSelection(0);
			}
			
			if(mSelectedMannschaftGastItemPosition <= mMannschaftGastSpinner.getAdapter().getCount()){
				mMannschaftGastSpinner.setSelection(mSelectedMannschaftGastItemPosition);
			}else{
				mMannschaftGastSpinner.setSelection(0);
			}
		}

		public void onNothingSelected(AdapterView<?> arg0) {
		}
	};

	private final AdapterView.OnItemSelectedListener mSpinnerMannschaftenHeimItemAuswahlListener = new AdapterView.OnItemSelectedListener() {
		public void onItemSelected(AdapterView<?> arg0, View arg1, int position, long id) {
			mSelectedMannschaftHeimItemPosition = position;
			KeyValueVO keyValueVO = (KeyValueVO) mMannschaftHeimSpinner.getSelectedItem();
			mSelectedMannschaftHeimKeyValueVO = keyValueVO;
		}

		public void onNothingSelected(AdapterView<?> arg0) {
		}
	};
	
	private final AdapterView.OnItemSelectedListener mSpinnerMannschaftenGastItemAuswahlListener = new AdapterView.OnItemSelectedListener() {
		public void onItemSelected(AdapterView<?> arg0, View arg1, int position, long id) {
			mSelectedMannschaftGastItemPosition = position;
			KeyValueVO keyValueVO = (KeyValueVO) mMannschaftGastSpinner.getSelectedItem();
			mSelectedMannschaftGastKeyValueVO = keyValueVO;
		}

		public void onNothingSelected(AdapterView<?> arg0) {
		}
	};

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		if (resultCode == RESULT_OK && requestCode == REQUEST_CODE_WETTKAMPF_PAARUNGEN) {
			if (data.hasExtra(INTENT_EXTRA_WETTKAMPF_PAARUNG_HEIM) && data.hasExtra(INTENT_EXTRA_WETTKAMPF_PAARUNG_GAST)) {
				ErgebnisVO[] paarung = new ErgebnisVO[2];
				ErgebnisVO ergHeim = (ErgebnisVO) data.getExtras().getSerializable(INTENT_EXTRA_WETTKAMPF_PAARUNG_HEIM);
				ErgebnisVO ergGast = (ErgebnisVO) data.getExtras().getSerializable(INTENT_EXTRA_WETTKAMPF_PAARUNG_GAST);
				paarung[0] = ergHeim;
				paarung[1] = ergGast;
				paarungen.put(new Integer(mPaarungInex), paarung);
				updatePaarungErgebnisse();
			}
		} 
	}
	
	private void updatePaarungErgebnisse(){
		if(paarungen.containsKey(new Integer(1))){
			mEdtPaarung1.setText(getErgebnisProPaarung(paarungen.get(new Integer(1))));
		}
		if(paarungen.containsKey(new Integer(2))){
			mEdtPaarung2.setText(getErgebnisProPaarung(paarungen.get(new Integer(2))));		
		}
		if(paarungen.containsKey(new Integer(3))){
			mEdtPaarung3.setText(getErgebnisProPaarung(paarungen.get(new Integer(3))));
		}
		if(paarungen.containsKey(new Integer(4))){
			mEdtPaarung4.setText(getErgebnisProPaarung(paarungen.get(new Integer(4))));
		}
		if(paarungen.containsKey(new Integer(5))){
			mEdtPaarung5.setText(getErgebnisProPaarung(paarungen.get(new Integer(5))));
		}
		if(paarungen.containsKey(new Integer(6))){
			mEdtPaarung6.setText(getErgebnisProPaarung(paarungen.get(new Integer(6))));
		}
	}
	
	private String getErgebnisProPaarung(ErgebnisVO[] paarung){
		StringBuffer bf = new StringBuffer();
		if( null != paarung[0] && null != paarung[1] ){
			bf.append(paarung[0].gesamtergebnis).append(" - ").append(paarung[1].gesamtergebnis);
		}else{
			return "0 - 0";
		}
		
		
		return bf.toString();
	}
	
	private final OnTouchListener mSpielTagListener = new OnTouchListener() {
		
		@Override
		public boolean onTouch(View v, MotionEvent event) {
			if(MotionEvent.ACTION_DOWN == event.getAction()){
				showDialog(DATE_DIALOG_ID);
			}
			
			return true;
		}
	};
	
	private final OnClickListener mPaarung1OnOkListener = new OnClickListener() {
		public void onClick(View v) {
			handlePaarung(1);
		}
	};
	
	private final OnClickListener mPaarung2OnOkListener = new OnClickListener() {
		public void onClick(View v) {
			handlePaarung(2);
		}
	};
	
	private final OnClickListener mPaarung3OnOkListener = new OnClickListener() {
		public void onClick(View v) {
			handlePaarung(3);
		}
	};
	
	private final OnClickListener mPaarung4OnOkListener = new OnClickListener() {
		public void onClick(View v) {
			handlePaarung(4);
		}
	};
	
	private final OnClickListener mPaarung5OnOkListener = new OnClickListener() {
		public void onClick(View v) {
			handlePaarung(5);
		}
	};
	
	private final OnClickListener mPaarung6OnOkListener = new OnClickListener() {
		public void onClick(View v) {
			handlePaarung(6);
		}
	};
	
	private void handlePaarung(int paarungIndex) {
		boolean valid = true;
		if(edtSpielTag.getText().length() < 1 ){
			valid = false;
		}
		if(edtSpielNr.getText().length() < 1){
			valid = false;
		}
		
		if(valid){
			final Intent intent = new Intent(this, PaarungTabActivity.class);
			this.mPaarungInex = paarungIndex;
			if(paarungen.containsKey(new Integer(mPaarungInex))){
				ErgebnisVO[] ergebnisse = paarungen.get(new Integer(paarungIndex));
				mSelectedErgebnisHeimVO = ergebnisse[0];
				mSelectedErgebnisGastVO = ergebnisse[1];
			}
			intent.putExtra(INTENT_EXTRA_WETTKAMPF_MANNSCHAFT_HEIM, mSelectedMannschaftHeimKeyValueVO);
			intent.putExtra(INTENT_EXTRA_WETTKAMPF_MANNSCHAFT_GAST, mSelectedMannschaftGastKeyValueVO);
			
			intent.putExtra(INTENT_EXTRA_WETTKAMPF_ERGEBNIS_HEIM, mSelectedErgebnisHeimVO);
			intent.putExtra(INTENT_EXTRA_WETTKAMPF_ERGEBNIS_GAST, mSelectedErgebnisGastVO);
			
			
			intent.putExtra(INTENT_EXTRA_WETTKAMPF_PAARUNG, mPaarungInex);
			intent.putExtra(INTENT_EXTRA_WETTKAMPF_SPIELTAG, edtSpielTag.getText().toString());
			intent.putExtra(INTENT_EXTRA_WETTKAMPF_SPIELNR, edtSpielNr.getText().toString());
			
			intent.putExtra(INTENT_EXTRA_EDIT_MODE, paarungen.containsKey(new Integer(mPaarungInex)));
			
			startActivityForResult(intent, REQUEST_CODE_WETTKAMPF_PAARUNGEN);
		}else{
			Toast.makeText(this, "Spieltag und Spielnummer muessen eingegeben werden!", Toast.LENGTH_LONG).show();
		}
		
	}

	private void loadPreference(){
		SharedPreferences mySharedPreferences = getPrivateSharedPreferences();
		int klassePos = mySharedPreferences.getInt(PREFERENCE_KEY_INDEX_SPIELGRUPPE, 0);
		int mannschaftHeimPos = mySharedPreferences.getInt(PREFERENCE_KEY_INDEX_MANNSCHAFT_HEIM, 0);
		int mannschaftGastPos = mySharedPreferences.getInt(PREFERENCE_KEY_INDEX_MANNSCHAFT_GAST, 0);
		mSelectedKlasseItemPosition = klassePos;
		mSelectedMannschaftHeimItemPosition = mannschaftHeimPos;
		mSelectedMannschaftGastItemPosition = mannschaftGastPos;
	}
	
	private SharedPreferences getPrivateSharedPreferences(){
		return getSharedPreferences("KegelVerwaltungPrefs", Activity.MODE_PRIVATE);
	}
	
	private void savePreference() {
		KegelverwaltungPreference.getInstance(this).saveIntState(
				PREFERENCE_KEY_INDEX_SPIELGRUPPE, mSelectedKlasseItemPosition).saveIntState(
						PREFERENCE_KEY_INDEX_MANNSCHAFT_HEIM, mSelectedMannschaftHeimItemPosition).saveIntState(
								PREFERENCE_KEY_INDEX_MANNSCHAFT_GAST, mSelectedMannschaftGastItemPosition);
		
	}

}
